package banco;

import java.util.Date;
import java.util.Scanner;
import java.text.ParseException;
import java.text.SimpleDateFormat;

import banco.BancoDados;
import banco.ContaCorrente;
import banco.Operacoes;
import banco.Imposto;

public class guiCliente {
	
	public guiCliente() {
		
	}
	
	public Cliente login(int conta, String senha, BancoDados dadosSistema) {
		Cliente clienteLogado = new Cliente();
		Cliente percorreLista = new Cliente();
		for(int i = 0; i<dadosSistema.clientes.size(); i++)
		{
			percorreLista = dadosSistema.clientes.get(i);
			
			if(percorreLista.conta!=null) {
				if(percorreLista.conta.numero==conta) {
					if(percorreLista.senha.equals(senha)) {
						clienteLogado = percorreLista;
					}
				}
			}
		}
		return clienteLogado;
	}
	
	public boolean fazSaque(int agencia, int conta, float valor, BancoDados dadosSistema) {
		float saldoAtualizado;
		boolean semErros = false;
		Date data = new Date();
		Imposto imposto = new Imposto();
		float valor_imposto;
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == conta) {
					contaEncontrada = percorreLista;
				}
		}
		
		if(contaEncontrada.numero != -1) {
			valor_imposto = imposto.calculaImposto(valor);
			if(contaEncontrada.getSaldo() > valor + valor_imposto) {
				Saque novoSaque = new Saque(data, valor, agencia, conta);
				contaEncontrada.adicionaSaque(novoSaque);				
				
				saldoAtualizado = contaEncontrada.getSaldo() - valor - valor_imposto;
				contaEncontrada.setSaldo(saldoAtualizado);
				
				System.out.println("Saque realizado com sucesso.\nSeu novo saldo �:" + saldoAtualizado + "\n");
				System.out.println("Valor CPMF �:" + valor_imposto + "\n");
				semErros = true;
			}
		}
		return semErros;
	}
	
	public boolean fazTransferencia(int agenciaOrigem, int agenciaDestino, int contaOrigem, int contaDestino, float valor, BancoDados dadosSistema)	{
		float novoSaldoOrigem;
		float novoSaldoDestino;
		boolean semErros = false;
		Imposto imposto = new Imposto();
		float valor_imposto;
		Date data = new Date();
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaDestinoEncontrada = new ContaCorrente();
		ContaCorrente contaOrigemEncontrada = new ContaCorrente();
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaDestino) {
					contaDestinoEncontrada = percorreLista;
				}
		}
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaOrigem) {
					contaOrigemEncontrada = percorreLista;
				}
		}
		
		if((contaOrigemEncontrada.numero != -1) && (contaDestinoEncontrada.numero != -1)) {
			valor_imposto = imposto.calculaImposto(valor);
			if(contaOrigemEncontrada.getSaldo() > valor + valor_imposto) {
				Transferencia novaTransf = new Transferencia(data, valor, agenciaOrigem, agenciaDestino, contaOrigem, contaDestino);
				contaOrigemEncontrada.adicionaTransferencia(novaTransf);
				contaDestinoEncontrada.adicionaTransferencia(novaTransf);			
				
				novoSaldoOrigem = contaOrigemEncontrada.getSaldo() - valor - valor_imposto;
				novoSaldoDestino = contaDestinoEncontrada.getSaldo() + valor;
				
				contaOrigemEncontrada.setSaldo(novoSaldoOrigem);
				contaDestinoEncontrada.setSaldo(novoSaldoDestino);
				System.out.println("Transfer�ncia realizada com sucesso.\nSeu novo saldo �:" + novoSaldoOrigem + "\n");
				System.out.println("Valor CPMF �:" + valor_imposto + "\n");
				semErros = true;
			}
		}
		return semErros;
	}
	
	public boolean imprimeSaldo(int conta, BancoDados dadosSistema) {
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		boolean semErros = false;
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == conta) {
					contaEncontrada = percorreLista;
				}
		}
		
		if(contaEncontrada.numero != -1) {
			Date dataAtual = new Date();
			String dataAtualFormatada = new SimpleDateFormat("dd/MM/yyyy '�s' HH:mm:ss").format(dataAtual);
			System.out.println("O saldo da sua conta �: " + contaEncontrada.getSaldo());
			System.out.println("\nConsulta realizada em " + dataAtualFormatada);
			semErros = true;
		}
		return semErros;
	}
	
	public boolean imprimeExtrato(int conta, BancoDados dadosSistema) {
		ContaCorrente percorreListaContas = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		Operacoes percorreListaOps = new Operacoes();
		Scanner controleInput = new Scanner(System.in);
		int controleOpcao;
		Date dataAtual = new Date();
		String dataFormatadaMes = new SimpleDateFormat("MM").format(dataAtual);
		int mes = Integer.parseInt(dataFormatadaMes);
		String dataFormatadaAno = new SimpleDateFormat("yyyy").format(dataAtual);
		int ano = Integer.parseInt(dataFormatadaAno);
		String dataFormatadaDia = new SimpleDateFormat("dd").format(dataAtual);	
		boolean semErros = true;
		String diaInicio = null;
		String mesInicio = null;
		String anoInicio = null;
		String[] dataInicio = null;
		String[] dataFim = null;
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreListaContas = dadosSistema.contas.get(i);
			
			if(percorreListaContas.numero == conta) {
					contaEncontrada = percorreListaContas;
				}
		}
		
		if(contaEncontrada.numero != -1) {
			System.out.println("Selecione o tipo de extrato a ser emitido:\n");
			System.out.println("1 - M�s anterior\n2 - Per�odo personalizado\n");
			controleOpcao = controleInput.nextInt();
			
			switch (controleOpcao) {
			case 1:
				System.out.println("Escolha o m�s:\n");
				int controleMes = mes;
				int controleAno = ano;
				for(int i=1; i<7; i++) {
					System.out.println(i + " - " + controleMes + "/" + controleAno + "\n");
					if(controleMes>1) {
						controleMes--;
					} else {
						controleMes += 11;
						controleAno--;
					}
				}
				controleOpcao = controleInput.nextInt();
				switch (controleOpcao) {
				case 1:
					controleMes = mes;
					controleAno = ano;
					break;
				case 2:
					if(mes>1) {
						controleMes = mes-1;
						controleAno = ano;
					}
					else {
						controleMes = mes+11;
						controleAno = ano-1;
					}
					break;
				case 3:
					if(mes>2) {
						controleMes = mes-2;
						controleAno = ano;
					}
					else {
						controleMes = mes+10;
						controleAno = ano-1;
					}
					break;
				case 4:
					if(mes>3) {
						controleMes = mes-3;
						controleAno = ano;
					}
					else {
						controleMes = mes+9;
						controleAno = ano-1;
					}
					break;
				case 5:
					if(mes>4) {
						controleMes = mes-4;
						controleAno = ano;
					}
					else {
						controleMes = mes+8;
						controleAno = ano-1;
					}
					break;
				case 6:
					if(mes>5) {
						controleMes = mes-5;
						controleAno = ano;
					}
					else {
						controleMes = mes+7;
						controleAno = ano-1;
					}
					break;
				default:
					System.out.println("Op��o inexistente.\n");
					semErros = false;
					break;
				}
				if(semErros) {
					System.out.println("Extrato:\n");
					for(int i = 0; i<contaEncontrada.operacoes.size(); i++)
					{
						percorreListaOps = contaEncontrada.operacoes.get(i);
	
						if(percorreListaOps.deposito != null) {
							String mesDeposito = new SimpleDateFormat("MM").format(percorreListaOps.deposito.data);
							int mesDepositoInt = Integer.parseInt(mesDeposito);
							String anoDeposito = new SimpleDateFormat("yyyy").format(percorreListaOps.deposito.data);
							int anoDepositoInt = Integer.parseInt(anoDeposito);
							String dataDeposito = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.deposito.data);
							
							if((mesDepositoInt==controleMes) && (anoDepositoInt==controleAno)) {
								System.out.println(i + " - Dep�sito: " + percorreListaOps.deposito.valor + " em " + dataDeposito + "\n");
							}
						} else if(percorreListaOps.saque != null) {
							String mesSaque = new SimpleDateFormat("MM").format(percorreListaOps.saque.data);
							int mesSaqueInt = Integer.parseInt(mesSaque);
							String anoSaque = new SimpleDateFormat("yyyy").format(percorreListaOps.saque.data);
							int anoSaqueInt = Integer.parseInt(anoSaque);
							String dataSaque = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.saque.data);
							
							if((mesSaqueInt==controleMes) && (anoSaqueInt==controleAno)) {
								System.out.println(i + " - Saque: " + percorreListaOps.saque.valor + " em " + dataSaque + "\n");
							}
						} else if (percorreListaOps.transferencia != null) {
							String mesTransferencia = new SimpleDateFormat("MM").format(percorreListaOps.transferencia.data);
							int mesTransferenciaInt = Integer.parseInt(mesTransferencia);
							String anoTransferencia = new SimpleDateFormat("yyyy").format(percorreListaOps.transferencia.data);
							int anoTransferenciaInt = Integer.parseInt(anoTransferencia);
							String dataTransferencia = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.transferencia.data);
							
							if((mesTransferenciaInt==controleMes) && (anoTransferenciaInt==controleAno)) {
								System.out.println(i + " - Transferencia: " + percorreListaOps.transferencia.valor + " em " + dataTransferencia + "\n");
							}
						} else if (percorreListaOps.pagamento != null) {
							String mesPagamento = new SimpleDateFormat("MM").format(percorreListaOps.pagamento.data);
							int mesPagamentoInt = Integer.parseInt(mesPagamento);
							String anoPagamento = new SimpleDateFormat("yyyy").format(percorreListaOps.pagamento.data);
							int anoPagamentoInt = Integer.parseInt(anoPagamento);
							String dataPagamento = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.pagamento.data);
							
							if((mesPagamentoInt==controleMes) && (anoPagamentoInt==controleAno)) {
								System.out.println(i + " - Pagamento: " + percorreListaOps.transferencia.valor + " em " + dataPagamento + "\n");
							}
						}
					}
				}
				break;
			case 2:
				System.out.println("Escolha a data inicial do per�odo no formato dd/mm/aaaa:\n");
				String dataInicioBruta = controleInput.next();
				if(dataInicioBruta.equals("")) {
				} else {
					dataInicio = dataInicioBruta.split("/");
				}
				System.out.println("Escolha a data final do per�odo no formato dd/mm/aaaa:\n");
				String dataFimBruta = controleInput.next();
				if(dataFimBruta.equals("")) {
				} else {
					dataFim = dataFimBruta.split("/");
					int k = 0;
					do {
						percorreListaOps = contaEncontrada.operacoes.get(k);
						
						if(percorreListaOps.deposito != null) {
							diaInicio = new SimpleDateFormat("dd").format(percorreListaOps.deposito.data);
							mesInicio = new SimpleDateFormat("MM").format(percorreListaOps.deposito.data);
							anoInicio = new SimpleDateFormat("yyyy").format(percorreListaOps.deposito.data);
						} else if (percorreListaOps.transferencia != null) {
							diaInicio = new SimpleDateFormat("dd").format(percorreListaOps.transferencia.data);
							mesInicio = new SimpleDateFormat("MM").format(percorreListaOps.transferencia.data);
							anoInicio = new SimpleDateFormat("yyyy").format(percorreListaOps.transferencia.data);
						} else if (percorreListaOps.saque != null) {
							diaInicio = new SimpleDateFormat("dd").format(percorreListaOps.saque.data);
							mesInicio = new SimpleDateFormat("MM").format(percorreListaOps.saque.data);
							anoInicio = new SimpleDateFormat("yyyy").format(percorreListaOps.saque.data);
						} else if (percorreListaOps.pagamento != null) {
							diaInicio = new SimpleDateFormat("dd").format(percorreListaOps.pagamento.data);
							mesInicio = new SimpleDateFormat("MM").format(percorreListaOps.pagamento.data);
							anoInicio = new SimpleDateFormat("yyyy").format(percorreListaOps.pagamento.data);
						}
						k++;
					} while((!mesInicio.equals(dataInicio[1])) && (!anoInicio.endsWith(dataInicio[2])) && (!diaInicio.equals(dataInicio[0])) && k<contaEncontrada.operacoes.size());
					int j = 1;
					while((!dataFormatadaMes.equals(dataFim[1])) && (!dataFormatadaAno.endsWith(dataFim[2])) && (!dataFormatadaDia.equals(dataFim[0])) && k<contaEncontrada.operacoes.size()) {
						percorreListaOps = contaEncontrada.operacoes.get(k);
						
						if(percorreListaOps.deposito != null) {
							String dataDeposito = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.deposito.data);
							System.out.println(j + " - Dep�sito: " + percorreListaOps.deposito.valor + " em " + dataDeposito + "\n");
						} else if(percorreListaOps.saque != null) {
							String dataSaque = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.saque.data);
							System.out.println(j + " - Saque: " + percorreListaOps.saque.valor + " em " + dataSaque + "\n");
						} else if (percorreListaOps.transferencia != null) {
							String dataTransferencia = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.transferencia.data);
							System.out.println(j + " - Transferencia: " + percorreListaOps.transferencia.valor + " em " + dataTransferencia + "\n");
						} else if (percorreListaOps.pagamento != null) {
							String dataPagamento = new SimpleDateFormat("dd/MM/yyyy").format(percorreListaOps.pagamento.data);
							System.out.println(j + " - Pagamento: " + percorreListaOps.pagamento.valor + " em " + dataPagamento + "\n");
						}						
						j++;
						k++;
					}
				}
				break;
			default:
				System.out.println("Op��o inv�lida.\n");
				semErros = false;
				break;
			}
		}
		controleInput.close();
		return semErros;
	}
	
	public Cliente logout(BancoDados dadosSistema) {
		return dadosSistema.clientes.get(0);
	}

	public boolean efetuaPagamento(int agenciaOrigem, int agenciaDestino, int contaOrigem, int contaDestino, 
			String dataVencimento, float valor, float multaPagamento, BancoDados dadosSistema) throws ParseException {
			
		float novoSaldoOrigem;
		float novoSaldoDestino;
		boolean semErros = false;
		Imposto imposto = new Imposto();
		float valor_imposto;
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaDestinoEncontrada = new ContaCorrente();
		ContaCorrente contaOrigemEncontrada = new ContaCorrente();
		
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaDestino) {
					contaDestinoEncontrada = percorreLista;
				}
		}
		for(int i = 0; i<dadosSistema.contas.size(); i++)
		{
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == contaOrigem) {
					contaOrigemEncontrada = percorreLista;
				}
		}
		
		if((contaOrigemEncontrada.numero != -1) && (contaDestinoEncontrada.numero != -1)) {
			
			Date dataMulta = new SimpleDateFormat("ddMMyyyy").parse(dataVencimento);
			Date dataAtual = new Date();
			
			float valorComMulta = valor;
			if (dataAtual.after(dataMulta)){
				valorComMulta += valor * (multaPagamento / 100); 
			}
				
			valor_imposto = imposto.calculaImposto(valorComMulta);
			if(contaOrigemEncontrada.getSaldo() > valorComMulta + valor_imposto) {
				Pagamento novoPagamOrigem = new Pagamento(dataAtual, dataMulta, valor, valorComMulta, multaPagamento, agenciaOrigem, agenciaDestino, contaOrigem, contaDestino);
				Pagamento novoPagamDestino = new Pagamento(dataAtual, dataMulta, valor, valorComMulta, multaPagamento, agenciaOrigem, agenciaDestino, contaOrigem, contaDestino);			
				contaOrigemEncontrada.adicionaPagamento(novoPagamOrigem);
				contaDestinoEncontrada.adicionaPagamento(novoPagamDestino);
				
				novoSaldoOrigem = contaOrigemEncontrada.getSaldo() - valorComMulta - valor_imposto;
				novoSaldoDestino = contaDestinoEncontrada.getSaldo() + valorComMulta;
				
				contaOrigemEncontrada.setSaldo(novoSaldoOrigem);
				contaDestinoEncontrada.setSaldo(novoSaldoDestino);
				System.out.println("Transfer�ncia realizada com sucesso.\nSeu novo saldo �:" + novoSaldoOrigem + "\n");
				System.out.println("Valor CPMF �:" + valor_imposto + "\n");
				semErros = true;
			}
		}
		return semErros;
	}

	public boolean fazDepositoComVerificacao(int nroConta, int nroAgencia,
			float valor, int envelope, BancoDados dadosSistema) {
		
		ContaCorrente percorreLista = new ContaCorrente();
		ContaCorrente contaEncontrada = new ContaCorrente();
		Date data = new Date();
		boolean semErros = false;
		
		for(int i = 0; i<dadosSistema.contas.size(); i++){
			percorreLista = dadosSistema.contas.get(i);
			
			if(percorreLista.numero == nroConta) {
					contaEncontrada = percorreLista;
			}
		}
		
		if(contaEncontrada.numero != -1) {
			Deposito novoDeposito = new Deposito(envelope, data, valor, nroAgencia, nroConta, false, false);
			dadosSistema.depositosAguardandoVerificacao.add(novoDeposito);
			System.out.println("Dep�sito aguardando aprovação.\n");
			semErros = true;
		}
		
		return semErros;
	}

}
